package com.edu.exam.entity.grading.export;

import com.edu.exam.enums.TemplateApplicationScenario;
import com.edu.exam.enums.TemplateComplexityLevel;
import com.edu.exam.enums.TemplateType;
import com.edu.exam.enums.TemplateStatus;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;

/**
 * 成绩导出模板表实体类
 *
 * <p>所属模块：B-06 成绩管理模块</p>
 * <p>对应数据库表：grade_export_template</p>
 *
 * <p>成绩导出模板管理表，用于管理各种成绩导出模板的基础信息。
 * 支持多种导出模板的统一管理，包含模板定义、格式关联、
 * 应用场景管理、版本控制等功能。</p>
 *
 * <p>主要功能特性：</p>
 * <ul>
 *   <li>模板基础信息管理（模板名称、类型、描述等）</li>
 *   <li>模板内容和样式配置管理</li>
 *   <li>模板格式和关联关系管理</li>
 *   <li>模板版本控制和变更历史</li>
 *   <li>模板应用场景和分类管理</li>
 *   <li>模板使用统计和性能分析</li>
 * </ul>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Entity
public class GradeExportTemplate {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 模板名称
     */
    @Column(name = "template_name", nullable = false, length = 100)
    private String templateName;

    /**
     * 模板代码
     */
    @Column(name = "template_code", nullable = false, unique = true, length = 50)
    private String templateCode;

    /**
     * 模板类型
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "template_type", nullable = false, length = 20)
    private TemplateType templateType;

    /**
     * 模板状态
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "template_status", nullable = false, length = 20)
    private TemplateStatus templateStatus;

    /**
     * 关联的格式ID
     */
    @Column(name = "format_id")
    private Long formatId;

    /**
     * 关联的格式对象
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "format_id", insertable = false, updatable = false)
    private GradeExportFormat format;

    /**
     * 模板版本
     */
    @Column(name = "template_version", nullable = false, length = 20)
    private String templateVersion;

    /**
     * 模板描述
     */
    @Column(name = "description", length = 500)
    private String description;

    /**
     * 模板内容
     */
    @Column(name = "template_content", columnDefinition = "TEXT")
    private String templateContent;

    /**
     * 模板样式
     */
    @Column(name = "template_style", columnDefinition = "TEXT")
    private String templateStyle;

    /**
     * 模板参数配置
     */
    @Column(name = "template_params", columnDefinition = "TEXT")
    private String templateParams;

    /**
     * 模板变量定义
     */
    @Column(name = "template_variables", columnDefinition = "TEXT")
    private String templateVariables;

    /**
     * 模板脚本内容
     */
    @Column(name = "template_script", columnDefinition = "TEXT")
    private String templateScript;

    /**
     * 模板预览图
     */
    @Column(name = "preview_image", length = 200)
    private String previewImage;

    /**
     * 模板缩略图
     */
    @Column(name = "thumbnail_image", length = 200)
    private String thumbnailImage;

    /**
     * 应用场景
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "application_scenario", length = 30)
    private TemplateApplicationScenario applicationScenario;

    /**
     * 模板分类
     */
    @Column(name = "template_category", length = 50)
    private String templateCategory;

    /**
     * 适用范围
     */
    @Column(name = "applicable_scope", length = 200)
    private String applicableScope;

    /**
     * 数据源配置
     */
    @Column(name = "data_source_config", columnDefinition = "TEXT")
    private String dataSourceConfig;

    /**
     * 输出配置
     */
    @Column(name = "output_config", columnDefinition = "TEXT")
    private String outputConfig;

    /**
     * 验证规则配置
     */
    @Column(name = "validation_rules", columnDefinition = "TEXT")
    private String validationRules;

    /**
     * 是否系统模板
     */
    @Column(name = "is_system", nullable = false)
    private Boolean isSystem;

    /**
     * 是否公开模板
     */
    @Column(name = "is_public", nullable = false)
    private Boolean isPublic;

    /**
     * 是否默认模板
     */
    @Column(name = "is_default", nullable = false)
    private Boolean isDefault;

    /**
     * 是否启用
     */
    @Column(name = "is_enabled", nullable = false)
    private Boolean isEnabled;

    /**
     * 使用次数
     */
    @Column(name = "usage_count")
    private Long usageCount;

    /**
     * 下载次数
     */
    @Column(name = "download_count")
    private Long downloadCount;

    /**
     * 平均生成时间（毫秒）
     */
    @Column(name = "avg_generation_time_ms")
    private Long avgGenerationTimeMs;

    /**
     * 模板标签
     */
    @Column(name = "template_tags", length = 300)
    private String templateTags;

    /**
     * 模板关键字
     */
    @Column(name = "template_keywords", length = 200)
    private String templateKeywords;

    /**
     * 模板评分
     */
    @Column(name = "template_rating")
    private Integer templateRating;

    /**
     * 模板评分次数
     */
    @Column(name = "rating_count")
    private Integer ratingCount;

    /**
     * 模板复杂度
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "complexity_level", length = 20)
    private TemplateComplexityLevel complexityLevel;

    /**
     * 模板大小（字节）
     */
    @Column(name = "template_size_bytes")
    private Long templateSizeBytes;

    /**
     * 最大数据行数
     */
    @Column(name = "max_data_rows")
    private Integer maxDataRows;

    /**
     * 兼容性信息
     */
    @Column(name = "compatibility_info", length = 200)
    private String compatibilityInfo;

    /**
     * 扩展配置
     */
    @Column(name = "extension_config", columnDefinition = "TEXT")
    private String extensionConfig;

    // ===== 审计字段 =====

    /**
     * 创建人ID
     */
    @Column(name = "creator_id")
    private Long creatorId;

    /**
     * 更新人ID
     */
    @Column(name = "updater_id")
    private Long updaterId;

    /**
     * 删除人ID
     */
    @Column(name = "deleter_id")
    private Long deleterId;

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 删除时间
     */
    @Column(name = "delete_time")
    private LocalDateTime deleteTime;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version")
    private Integer version = 0;

    /**
     * 逻辑删除标记
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;
}